<?php
class Solicitudes_Model_Historicoprocesos extends Model_Cna {
    
    const CONDICIONES_INICIALES = 1;
    const COMPLETITUD = 2;
    const DESIGNACION_CONSEJEROS = 3;
    const CONSEJEROS_DESIGNADOS = 4;
    const ESPERA_INFORME_CONSEJERO = 5;
    const CON_INFORME_CONSEJERO = 6;
    const APROBADO_AUTOEVALUACION =7;
    const EN_AUTOEVALUACION = 8;
    const EN_PRESELECCION_PARES = 9;
    const CON_PARES_DESIGNADOS = 10;
    const ESPERA_INFORME_PAR = 11;
    const CON_INFORME_PAR = 12;
    const CON_CONSEJERO_DESIGNADO = 13;
    const PARA_COMENTARIOS_DEL_RECTOR = 14;
    const CON_COMENTARIOS_DEL_RECTOR = 15;
    const CON_PONENCIA_DEL_CONSEJERO = 16;
    const CON_CONCEPTO = 17;
    const CON_RESOLUCION = 18;
    const DESISTIMIENTO = 19;
    const RECOMENDADO = 20;
    const COMPLETITUD_AUTOEVALUACION = 21;
    
    private $historicoProcesoTable;
    private $_observers = array();

    public function __construct() {
        parent::__construct();
        $this->historicoProcesoTable = new Solicitudes_Model_DbTable_Historicoprocesos();
        
        /* Se agregan los observadores de cambio de estado */
        $this->addObserver(new App_Observer_Estado());
    }

    /**
     * Adiciona un observador
     * @param App_Observer_Estado $observer
     */
    public function addObserver(App_Observer_Estado $observer) {
        $this->_observers[] = $observer;
    }

    /**
     * Notifica a los observadores registrados
     * @param array $datos Arreglo de datos del registro historico de estado almacenado
     */
    private function _notify(array $datos) {
        foreach($this->_observers as $observer) {
            $observer->notify($datos);
        }
    }

    /**
     * Almacena los datos del historico de estados en la base de datos
     * @param array $datos Los datos del histórico
     */
    public function guardarHistorico(array $datos) {
        $this->historicoProcesoTable->createRow($datos)->save();
        $this->_notify($datos);
    }
    
    /**
     * Almacena un estado para un proceso
     * @param int $codproceso
     * @param int $codestado
     * @param date $fecha
     * @param text $Observacion
     */
    public function guardarEstadoProceso($codproceso, $codestado, $fecha="", $observaciones="") {
        $solicitudesService = new Solicitudes_Model_Solicitudes();
	    $datos_proceso["codproceso"] = $codproceso;
	    $datos_proceso["codestado"] = $codestado;
	    
	    $solicitudesService->guardarProceso($datos_proceso);
		
        $datos_historico = array();
    	$datos_historico["codusuario"] = App_User::getCodigoUsuario();
	    $datos_historico["codestado"]  = $codestado;
        $datos_historico["codproceso"] = $codproceso;
        if (!empty($fecha)){
            $datos_historico["fecha"] = $fecha;
        }
        if (!empty($observaciones)){
            $datos_historico["observacion"] = $observaciones;
        }
        
        $this->guardarHistorico($datos_historico);
    }
    
	/**
	 * Obtiene todos los procesos, adicionalmente puede filtrar por codestado
	 * @return Array Datos
	 */
	public function getProcesos($codestado="") {
		return $this->historicoProcesoTable->getProcesos($codestado);
	}
	
	/**
	 * Obtiene todos los programas pendientes aceptacion pares
	 * @return Array Datos
	 */
	public function getPendientesAceptacionPares() {
		return $this->historicoProcesoTable->getPendientesAceptacionPares();
	}
	
	/**
	 * Obtiene todos los programas pendientes con pares por concretar visita
	 * @return Array Datos
	 */
	public function getPendientesConParesConcretarVisita() {
		return $this->historicoProcesoTable->getPendientesConParesConcretarVisita();
	}
	
	/**
	 * Obtiene todos los programas con agenda de visita pendiente realizar
	 * @return Array Datos
	 */
	public function getConAgendaDeVisitaPendienteRealizar() {
		return $this->historicoProcesoTable->getConAgendaDeVisitaPendienteRealizar();
	}
	
	/**
	 * Obtiene todos los programas con cambio en agenda de visita
	 * @return Array Datos
	 */
	public function getConCambioAgendaDeVisita() {
		return $this->historicoProcesoTable->getConCambioAgendaDeVisita();
	}
	
	/**
	 * Obtiene todos los programas pendiente informe de pares ajustado
	 * @return Array Datos
	 */
	public function getPendienteInformeParesAjustado() {
		return $this->historicoProcesoTable->getPendienteInformeParesAjustado();
	}
    
	/**
	 * Obtiene todos los programas pendiente informe de pares ajustado
	 * @return Array Datos
	 */
	public function getHistoricoProceso($codproceso) {
		return $this->historicoProcesoTable->getHistoricoProceso($codproceso);
	}
}//fin de la clase